const util = require("../common/util");
/**
 *  @typedef {DeviceCategoryDB} 
 * 
*/
const DeviceCategoryDB = require("../model/sqlite/deviceCategory");

/**
 * 获取所有设备分类
 * @param {import('express').Request} req
 * @param {import('express').Response} res
 */
async function findAll(req, res) {
  try {
    let db = DeviceCategoryDB.getInstance();
    await db.connect();
    let result = await db.findAll();
    util.logFormat("获取设备分类列表：%O", result);
    res.json(util.FormatJSONData(200, "设备分类列表", result));
  } catch (err) {
    util.err(err);
    res.json(util.FormatJSONData(500, "服务器内部错误", { Error: err }));
  }
}

/**
 * 获取单个设备分类详情
 * @param {import('express').Request} req
 * @param {import('express').Response} res
 */
async function find(req, res) {
  try {
    let db = DeviceCategoryDB.getInstance();
    await db.connect();
    let result = await db.find(req.params.id);
    if (!result) {
      return res.json(util.FormatJSONData(404, "设备分类不存在"));
    }
    util.logFormat(`获取设备分类【${req.params.id}】详情：%O`, result);
    res.json(util.FormatJSONData(200, `获取设备分类【${req.params.id}】`, result));
  } catch (err) {
    util.err(err);
    res.json(util.FormatJSONData(500, "服务器内部错误", { Error: err }));
  }
}

/**
 * 新建设备分类
 * @param {import('express').Request} req
 * @param {import('express').Response} res
 */
async function add(req, res) {
  try {
    const { name, description } = req.body;
    if (!name) {
      return res.json(util.FormatJSONData(400, "分类名称不能为空"));
    }

    let db = DeviceCategoryDB.getInstance();
    await db.connect();

    // 查重
    let exist = await db.findByName(name);
    if (exist) {
      return res.json(util.FormatJSONData(400, "分类名称已存在"));
    }

    let result = await db.add({ name, description });
    util.log(`新增设备分类: id -> ${result}`);
    const category = await db.find(result);
    res.json(util.FormatJSONData(201, "新增设备分类", category));
  } catch (err) {
    util.err(err);
    res.json(util.FormatJSONData(500, "服务器内部错误", { Error: err }));
  }
}

/**
 * 更新设备分类
 * @param {import('express').Request} req
 * @param {import('express').Response} res
 */
async function update(req, res) {
  try {
    const id = req.params.id;
    const { name, description } = req.body;
    if (!name) {
      return res.json(util.FormatJSONData(400, "分类名称不能为空"));
    }

    let db = DeviceCategoryDB.getInstance();
    await db.connect();

    let exist = await db.find(id);
    if (!exist) {
      return res.json(util.FormatJSONData(404, "设备分类不存在"));
    }

    // 查重（排除当前）
    let sameName = await db.findByName(name);
    if (sameName && sameName.id !== Number(id)) {
      return res.json(util.FormatJSONData(400, "分类名称已存在"));
    }

    let changed = await db.update(id, { name, description });
    if (changed === 0) {
      return res.json(util.FormatJSONData(400, "更新失败"));
    }

    const updated = await db.find(id);
    util.log(`更新设备分类【${id}】`);
    res.json(util.FormatJSONData(200, "更新设备分类", updated));
  } catch (err) {
    util.err(err);
    res.json(util.FormatJSONData(500, "服务器内部错误", { Error: err }));
  }
}

/**
 * 删除设备分类
 * @param {import('express').Request} req
 * @param {import('express').Response} res
 */
async function remove(req, res) {
  try {
    const id = req.params.id;
    let db = DeviceCategoryDB.getInstance();
    await db.connect();

    let exist = await db.find(id);
    if (!exist) {
      return res.json(util.FormatJSONData(404, "设备分类不存在"));
    }

    let deleted = await db.remove(id);
    if (deleted === 0) {
      return res.json(util.FormatJSONData(400, "删除失败"));
    }

    util.log(`删除设备分类【${id}】`);
    res.json(util.FormatJSONData(204, "删除设备分类"));
  } catch (err) {
    util.err(err);
    res.json(util.FormatJSONData(500, "服务器内部错误", { Error: err }));
  }
}

module.exports = {
  findAll,
  find,
  add,
  update,
  remove,
};